package maple.thelittleredbook.logging.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 日志模块异步配置
 */
@Slf4j
@Configuration
@EnableAsync
public class LoggingConfig {

    /**
     * 日志异步执行器
     * 专门用于异步保存系统日志，避免影响主业务性能
     */
    @Bean("logExecutor")
    public Executor logExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        // 核心线程数：始终保持活跃的线程数
        executor.setCorePoolSize(2);

        // 最大线程数：线程池允许的最大线程数
        executor.setMaxPoolSize(5);

        // 队列容量：当核心线程都忙碌时，新任务放入队列等待
        executor.setQueueCapacity(100);

        // 线程名称前缀：便于调试和监控
        executor.setThreadNamePrefix("log-async-");

        // 线程空闲时间：非核心线程的最大空闲时间（秒）
        executor.setKeepAliveSeconds(60);

        // 拒绝策略：当线程池和队列都满时的处理策略
        // CallerRunsPolicy：由调用线程执行任务，这样不会丢失日志
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        // 等待任务完成：关闭线程池时等待正在执行的任务完成
        executor.setWaitForTasksToCompleteOnShutdown(true);

        // 等待时间：关闭线程池时最多等待的时间（秒）
        executor.setAwaitTerminationSeconds(30);

        // 初始化线程池
        executor.initialize();

        log.info("日志异步执行器初始化完成: corePoolSize={}, maxPoolSize={}, queueCapacity={}",
                executor.getCorePoolSize(), executor.getMaxPoolSize(), executor.getQueueCapacity());

        return executor;
    }
}